package cn.gwm.flink.streaming.config;

import cn.gwm.utils.GlobalConfigUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Author: liangguang
 * @Date: 2023/02/08
 * @Description:
 */
@Getter
public enum TripConfigEnum implements GlobalConfig {
    INTERRUPT("interrupt", "15", "行程定义 行程中断：当每次行程中出现熄火、着车的中断时，当超过 ？分钟，视为两次行程"),
    TRAVELINTERVAL("travelInterval", "10", "行程定义 出行时间粒度:当每次行程相差在 ？分钟以内，视为同一出行时间"),
    TIMEERROR("timeError", "10", "行程定义 行程时间精度：当对同一OD出行，行程时间误差允许为 ？ 分钟"),
    MILEAGEERROR("mileageError", "2", "行程定义 行程里程精度：当对同一OD、同一路径出行，行程里程误差允许为 ？ 分钟"),
    ;


    /**
     * 显示
     */
    private String name;
    /**
     * 状态
     */
    private String value;
    /**
     * 描述
     */
    private String desc;

    TripConfigEnum(String name, String value, String desc) {
        this.name = name;
        this.value = value;
        this.desc = desc;
    }

    @Override
    public void setValue(String value) {
        this.value = value;
    }

    /**
     * 获取value参数  用 getValue方法，不能直接调用 .value 否则获取的是默认值
     *
     * @return
     */
    @Override
    public String getValue() {
        // 访问更新
        TripConfigUtil.controlUpdateConfig();
        return value;
    }

    @Slf4j
    static class TripConfigUtil {

        public static final String TOPIC = "trip";
        private static final Integer MINUTE = 19;

        public static AtomicBoolean REQUEST_FLAG = new AtomicBoolean(true);

        public static AtomicInteger FIRST = new AtomicInteger(0);

        public static void controlUpdateConfig() {
            if (FIRST.get() == 0) {
                GlobalConfigUtil.requestConfig(TOPIC, TripConfigEnum.values());
                FIRST.incrementAndGet();
            } else {
                // 每小时更新一次，19分
                if (DateUtil.date().getField(DateField.MINUTE) == MINUTE) {
                    if (REQUEST_FLAG.get()) {
                        GlobalConfigUtil.requestConfig(TOPIC, TripConfigEnum.values());
                        REQUEST_FLAG.set(false);
                    }
                } else {
                    REQUEST_FLAG.set(true);
                }
            }

        }


    }
}
